package br.unesp.demac.bcc.soo.sistemaclarus.dao;

import br.unesp.demac.bcc.soo.sistemaclarus.bean.Autor;
import br.unesp.demac.bcc.soo.sistemaclarus.bean.Localizacao;
import br.unesp.demac.bcc.soo.sistemaclarus.bean.Obra;
import br.unesp.demac.bcc.soo.sistemaclarus.util.FabricaConexao;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

/**
 *
 * @author Evaldo
 */
public class ObraDAOImp {
    
    /**
     * Salva dados da obra em inclusão
     * @param obra Obra a ser inserida
     * @return Status da inserção
     * @throws SQLException Exceção SQL
     */
    public boolean salvarObra(Obra obra) throws SQLException{
        boolean salvo = false;
        int idEditora = 0;
        int idObra = 0;

        final String query = "INSERT INTO OBRA (nomeObra, anoPublicacao, dataInclusao, flagExcluido, idLocalizacao, idEditora)" +
                " VALUES (?, ?, sysdate(), ?, ?, ?)";
        Connection conn = FabricaConexao.getConexao();
        PreparedStatement pstmt = null;
        ResultSet res = null;

        if (conn != null){
            try{
                conn.setAutoCommit(false);

                //insere a editora
                EditoraDAOImp editoraDao = new EditoraDAOImp();
                idEditora = editoraDao.salvarEditora(conn, obra.getEditora());

                //insere a obra
                pstmt = conn.prepareStatement(query, PreparedStatement.RETURN_GENERATED_KEYS);
                pstmt.setString(1, obra.getNomeObra());
                pstmt.setInt(2, obra.getAnoPublicacao());
                pstmt.setBoolean(3, false);
                pstmt.setInt(4, obra.getLocalizacao().getIdLocalizacao());
                pstmt.setInt(5, idEditora);
                pstmt.executeUpdate();
                res = pstmt.getGeneratedKeys();
                if (res.next())
                    idObra = res.getInt(1);

                //insere os autores
                AutorDAOImp autDao = new AutorDAOImp();
                for (Autor aut : obra.getAutor()){
                    autDao.salvarAutor(conn, aut, idObra);
                }

                conn.commit();
                salvo = true;
            }
            catch(SQLException ex){
                System.out.println("Erro ao salvar obra: " + ex.getMessage());
                throw ex;
            }
            finally{
                FabricaConexao.fechar(conn, pstmt);
            }
        }

        return salvo;
    }
    
    /**
     * Busca a lista de obras cadastradas
     * @return Lista de Obras
     * @throws SQLException Exceção SQL
     */
    public List<Obra> buscarObras() throws SQLException{
        final String query = "SELECT idObra, nomeObra, anoPublicacao, flagExcluido, ob.idLocalizacao, lo.codigoCorredor, lo.codigoPrateleira " +  
            "FROM obra ob JOIN localizacao lo ON ob.idLocalizacao = lo.idLocalizacao;";
        
        List<Obra> lstObra = new ArrayList<Obra>();
        Obra obr = null;
        Connection conn = FabricaConexao.getConexao();
        PreparedStatement pstmt = null;
        ResultSet res = null;
        
        if (conn != null){
            try{
                pstmt = conn.prepareStatement(query);
                res = pstmt.executeQuery();
                
                while (res.next()){
                    obr = new Obra();
                    Localizacao loc = new Localizacao();
                    
                    obr.setIdObra(res.getInt(1));
                    obr.setNomeObra(res.getString(2));
                    obr.setAnoPublicacao(res.getInt(3));
                    obr.setFlagExcluido(res.getBoolean(4));
                    loc.setIdLocalizacao(res.getInt(5));
                    loc.setCodigoCorredor(res.getString(6));
                    loc.setCodigoPrateleira(res.getString(7));
                    obr.setLocalizacao(loc);
                    
                    lstObra.add(obr);
                }
            }
            catch(SQLException ex){
                System.out.println("Erro ao consultar obra: " + ex.getMessage());
                throw ex;
            }
            finally{
                FabricaConexao.fechar(conn, pstmt);
            }
        }
        
        return lstObra;
    }
}
